package com.leng.utils;


import com.leng.entity.Menu;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 *@作者: 冷俊杰
 *@类名: MenuTreeBuilder类
 *@创建时间: 2022/8/23 9:13
 *@描述:
 *菜单树的构建工具
 *@修改原图
 *@修改作者
 *@修改时间
 */
public class MenuTreeBuilder {
    /**
     * 构建多级菜单树
     */
    public static List<Menu> build(List<Menu> menus){
        //封装一个方法，通过menus去解析菜单树
        //1.定义一个最终的返回结果，这个结果已经解析完menu，并存在children
        List<Menu> menuList = new ArrayList<>();
        //2.先找到1级菜单
        for (Menu menu : menus) {
            if (menu.getParentId()==0){
                //将一级菜单添加到menuList中
                menuList.add(menu);
            }
        }
        //实现排序,参数1：排序内容  参数2：排序方式
        Collections.sort(menuList,Menu.order());
        //3.为一级菜单设置子菜单，getChild是递归调用的
        //现在menuList这个集合中存放的都是一级菜单
        for (Menu menu : menuList) {
            //参数1：当前父级的ID   参数2：所有的菜单列表
            //只有循环所有的菜单，在结果中只有parent_id==menu.getId()，才是当前menu的子菜单
            menu.setChildren(getChild(menu.getId(), menus));
        }
        return menuList;
    }
    private static List<Menu> getChild(Long id, List<Menu> menus) {
        //定义一个子菜单的集合
        List<Menu> childrenMenu=new ArrayList<>();
        for(Menu menu : menus){
            if (menu.getParentId()==id && menu.getType().equals("0")){
                //添加子菜单到childrenMenu集合中
                childrenMenu.add(menu);
            }
        }
        //子菜单中可能存在子菜单，所以这里进行一个递归的操作(三级菜单/往后)
        for(Menu menu : childrenMenu){
            menu.setChildren(getChild(menu.getId(),menus));
        }
        //递归后再次实现一次排序
        Collections.sort(childrenMenu,Menu.order());
        //结束递归,当长度等于0时，代表已经查询不出来值了
        if (childrenMenu.size()==0){
            return null;
        }
        return childrenMenu;
    }
}
